import type { RouteRecordRaw } from 'vue-router'

/**
 * 加载需要用户权限才能访问的所有路由对象
 */
function loadLocalRoutes() {
  // 重要：动态的添加路由
  // 1.动态获取所有的路由对象，放到数组中
  // * 路由对象都在独立的文件中
  // * 从文件中将所有的路由对象先读取到数组中
  const localRoutes: RouteRecordRaw[] = []
  // 1.1读取router/main中所有的ts文件
  // require.context(webpack环境)/import.meta(vite环境)
  // 匹配 ../../router/main/下面所有的ts文件
  // ** 匹配所有子目录，* 匹配文件
  // 默认返回值数据是封装到一个函数中的，设置 eager（渴望立刻拿到数据）后，才能获取到对应的 Module
  // 返回值：对象类型
  const files: Record<string, any> = import.meta.glob('../router/main/**/*.ts', {
    eager: true
  })

  for (const key in files) {
    const module = files[key]
    localRoutes.push(module.default)
  }

  return localRoutes
}

/**
 *
 * @param userMenus 当前用户的菜单数组
 * @returns 当前用户有权限访问的路由数组
 */

export let firstMenu: any = null
export function mapMenusToRoutes(userMenus: any) {
  // 1.加载本地路由
  const localRoutes = loadLocalRoutes()

  // 2.根据菜单，去匹配正确的路由
  const routes: RouteRecordRaw[] = []
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      const route = localRoutes.find((item) => item.path === submenu.url)
      // 找到路由，再添加路由
      if (route) {
        // 1.给route的顶层菜单增加重定向的功能，但是只需要添加一次即可（添加的就是第一个二级路由）
        if (!routes.find((item) => item.path === menu.url)) {
          // 添加一级路由默认显示的二级路由
          routes.push({ path: menu.url, redirect: route.path })
        }
        // 添加有权限访问的二级路由
        routes.push(route)
      }
      // 记录第一个被匹配到的菜单
      if (!firstMenu && route) firstMenu = submenu
    }
  }

  return routes
}

/**
 * 根据路径去匹配需要显示的菜单
 * @param path 需要匹配的路径
 * @param userMenus 所有的菜单
 */
// export function mapPathToMenu(path: string, userMenus: any[]) {
//   for (const menu of userMenus) {
//     for (const submenu of menu.children) {
//       if (submenu.url === path) {
//         return submenu
//       }
//     }
//   }
// }
export function mapPathToMenu(path: string, userMenus: any[]) {
  for (const menu of userMenus) {
    if (menu.path === path) {
      return menu
    }
  }
}
interface IBreadcrumds {
  name: string
  path: string
}

/**
 * 动态匹配当前页面的面包屑路径
 * @param path 当前页面的路由路径
 * @param userMenus 用户菜单
 * @returns breadcrumbs数据数组
 */
export function mapPathToBreadcrumbs(path: string, userMenus: any[]) {
  // 1.定义面包屑
  const breadcrumbs: IBreadcrumds[] = []

  // 2。遍历获取面包屑层级
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        // 1.顶层菜单（一级）
        breadcrumbs.push({ name: menu.name, path: menu.children[0]?.url })
        // 2.匹配菜单（二级）
        breadcrumbs.push({ name: submenu.name, path: submenu.url })
      }
    }
  }

  return breadcrumbs
}

/**
 * 将菜单数组映射为对应的id数组
 * @param menuList 菜单数组
 */
export function mapMenuListToIds(menuList: any[]) {
  const ids: number[] = []

  // 注意：通过节点的id给El-Tree组件设置默认值时，不要获取一级菜单的id，因为如果勾选了一级菜单，那么该一级菜单下面的所有子菜单都会被勾选
  function recurseGetIds(menus: any[]) {
    for (const item of menus) {
      // 递归获取所有子菜单的id
      if (item.children) {
        recurseGetIds(item.children)
      } else {
        ids.push(item.id)
      }
    }
  }
  recurseGetIds(menuList)

  return ids
}

export function mapMenuListToPermissions(menuList: any[]) {
  const permissions: string[] = []

  function recurseGetPermission(menus: any) {
    for (const item of menus) {
      if (item.type === 3) {
        permissions.push(item.permission)
      } else {
        // children可能为空，循环对象为null时，可能报错，故使用 ?? 设置默认值
        recurseGetPermission(item.children ?? [])
      }
    }
  }
  recurseGetPermission(menuList)

  return permissions
}
